package com.github.common.extend.demo.config.filetask;

import java.io.IOException;
import java.io.InputStream;
import java.util.function.Consumer;

/**
 * @author wangjj7
 * @date 2023/8/3
 * @description
 */
public interface DataSourceBuilder<I extends InputStream> {

    /**
     * 生成数据源
     * @param rateRefresh 进度回调通知，可以为null
     */
    void buildSource(Consumer<Double> rateRefresh);

    /**
     * 获取数据源的输入流
     * {@link #buildSource(Consumer)}执行后调用
     * @return
     */
    I inputStream();

    /**
     * 获取流的总字节数（精确的）
     * 由于实现不同有些流（例如网络流）无法通过{@link InputStream#available()}精确获取流的总字节数
     * {@link #buildSource(Consumer)}执行后调用
     * @return <0：未知
     */
    default int length() {
        try (I inputStream = inputStream()){
            return inputStream.available();
        } catch (IOException e) {
            return -1;
        }
    }

}
